package com.zmn.mcc.business.interfaces.dept;

import com.zmn.common.dto.VtDTO;
import com.zmn.common.dto2.ResponseDTO;
import com.zmn.mcc.model.dto.OrgDeptDto;
import com.zmn.mcc.model.entity.dept.McDept;
import com.zmn.mcc.model.entity.dept.McDeptQuery;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 21:54
 */
public interface DeptBService {

    /**
     * 取得指定部门的上级部门
     *
     * @param deptId  当前组织ID
     * @param hasSelf 是否包含当前组织
     * @return McDept 部门列表
     */
    List<McDept> listDeptForAbove(Integer deptId, Boolean hasSelf);

    /**
     * 取得指定组织的部门列表
     *
     * @param query  组织ID
     * @return  McDept 部门列表
     */
    List<McDept> listDept(McDeptQuery query);

    /**
     * 取得指定部门和指定部门的所有下级部门
     *
     * @param deptIds 当前部门ID
     * @param status  部门状态
     * @return VtDTO VtDTO
     */
    List<VtDTO> listSubAllDeptIncludeSelf(List<Integer> deptIds, Integer status);

    /**
     * 描述: 构建部门树形结构
     * @param orgId
     * @return java.util.List<com.zmn.mcc.model.entity.dept.McDept>
     * @author jiafei
     * @since 2021/9/27 19:45
     */
    List<McDept> buildTreeDept(Integer orgId);

    /**
     * 新增部门
     *
     * @param dept
     * @return
     */
    ResponseDTO addDept(McDept dept);

    /**
     * 修改部门
     *
     * @param dept
     * @return
     */
    ResponseDTO modifyDept(McDept dept);

    /**
     * 修改部门默认角色
     *
     * @param deptId  部门ID
     * @param roleId  角色ID
     * @param updater
     * @return
     */
    ResponseDTO modifyDeptRoleId(Integer deptId, Integer roleId, String updater);

    /**
     * 根据主键查找
     *
     * @param deptId
     * @return McDept部门
     */
    McDept findByKey(Integer deptId);

    /**
     * 查找所有部门的上级部门和所在组织的上级组织
     *
     * @return OrgDeptDto 组织部门
     */
    OrgDeptDto findSuborOrgDept(Integer deptId);

    /**
     * 根据北森部门id查找所有部门的上级部门和所在组织的上级组织
     *
     * @return OrgDeptDto 组织部门
     */
    OrgDeptDto findSuborOrgDeptByBsDeptId(Integer bsDeptId);

    /**
     * 修改北森部门ID
     *
     * @param deptId   部门ID
     * @param bsDeptId 北森部门ID
     * @param updater  跟新者
     * @return ResponseDTO ResponseDTO
     */
    ResponseDTO modifyBeisenDeptId(Integer deptId, Integer bsDeptId, String updater);
}
